package br.com.datasun.biblioteca.ui.controller;

import java.awt.event.MouseEvent;
import java.util.ArrayList;
import java.util.List;

import javax.swing.JOptionPane;

import br.com.datasun.biblioteca.delegate.CadastrosDelegate;
import br.com.datasun.biblioteca.delegate.ConsultasDelegate;
import br.com.datasun.biblioteca.entities.Contato;
import br.com.datasun.biblioteca.entities.Documento;
import br.com.datasun.biblioteca.entities.TipoContato;
import br.com.datasun.biblioteca.entities.TipoDocumento;
import br.com.datasun.biblioteca.entities.Endereco;
import br.com.datasun.biblioteca.entities.Estado;
import br.com.datasun.biblioteca.entities.PessoaFisica;
import br.com.datasun.biblioteca.exceptions.BairroInvalidoException;
import br.com.datasun.biblioteca.exceptions.BusinessException;
import br.com.datasun.biblioteca.exceptions.CEPInvalidoException;
import br.com.datasun.biblioteca.exceptions.CidadeRequeridaException;
import br.com.datasun.biblioteca.exceptions.DAOException;
import br.com.datasun.biblioteca.exceptions.LogradouroInvalidoException;
import br.com.datasun.biblioteca.exceptions.NumeroLogradouroInvalidoException;
import br.com.datasun.biblioteca.exceptions.PessoaFisicaJaExistenteException;
import br.com.datasun.biblioteca.exceptions.PessoaFisicaSemNomeException;
import br.com.datasun.biblioteca.ui.CadastroClientesUI;
import br.com.datasun.biblioteca.ui.CadastroClientesUsuarioUI;

public class CadastroClienteController implements ICRUDController {
	private CadastrosDelegate cadastrosDelegate = new CadastrosDelegate();
	private ConsultasDelegate consultasDelegate = new ConsultasDelegate();
	private CadastroClientesUI ui;
	
	public CadastroClienteController (CadastroClientesUI ui){
		this.ui = ui;
	}
	
	public void btnAcessoEventHandler() {
		CadastroClientesUsuarioUI telaAcesso = new CadastroClientesUsuarioUI();
		telaAcesso.setModal(true);
		telaAcesso.setLocationRelativeTo(ui);
		telaAcesso.setVisible(true);		
	}
	
	@Override
	public void btnSalvarEventHandler() {
		// TODO Auto-generated method stub
		gravarCliente();
	}

	@Override
	public void btnFecharEventHandler() {
		// TODO Auto-generated method stub
		ui.limparFormulario();
		ui.editarCampos(false);
		ui.getController().mudarTela(TelaBiblioteca.MENU_CENTRAL_UI);
	}

	@Override
	public void btnNovoEventHandler() {
		// TODO Auto-generated method stub
		ui.limparFormulario();
		ui.editarCampos(true);
		ui.requestFocusCampoNomeCliente();
		ui.setIsEditing(false);			
		
	}

	@Override
	public void btnLimparEventHandler() {
		// TODO Auto-generated method stub
		ui.limparFormulario();
	}

	@Override
	public void excluirEventHandler() {
		// TODO Auto-generated method stub
		PessoaFisica clienteSelecionado = ui.getClienteSelecionado();
		if(clienteSelecionado != null){
			try{
				cadastrosDelegate.excluirCliente(clienteSelecionado);
				ui.removerCliente(clienteSelecionado);
				ui.limparFormulario();
			}catch (BusinessException e) {
				JOptionPane.showMessageDialog(ui,e.getMessage(), "Erro em operação de exclusão!", JOptionPane.ERROR_MESSAGE);
			}
		}else{
			JOptionPane.showMessageDialog(ui, "Por favor selecione um cliente para excluir!", "Seleção de cliente requerida!", JOptionPane.WARNING_MESSAGE);
		}
	}

	@Override
	public void selecionarParaEdicaoEventHandler(MouseEvent event) {
		// TODO Auto-generated method stub
		int quantidadeDeCliques = event.getClickCount();
		if(quantidadeDeCliques >= 2){
			int linhaSelecionada = ui.getIndiceClienteSelecionado();
			PessoaFisica pessoaFisicaAEditar = ui.getCliente(linhaSelecionada);
			ui.setIsEditing(true);//diz que h� um registro em edi��o
			ui.carregarFormularioAPartirDe(pessoaFisicaAEditar);
			PessoaFisica pessoaFisicaEmEdicao = copiarCliente(pessoaFisicaAEditar);
			ui.setClienteEmEdicao(pessoaFisicaEmEdicao);
			ui.editarCampos(true);
			ui.requestFocusCampoNomeCliente();
		}else{
			int linhaSelecionada = ui.getIndiceClienteSelecionado();
			PessoaFisica clienteSelecionado = ui.getCliente(linhaSelecionada);
			ui.setClienteSelecionado(clienteSelecionado);
			ui.carregarFormularioAPartirDe(clienteSelecionado);
		}
		
	}

	public void carregarEstadosComCidades(){
		List<Estado> estados;
		try{
			estados = consultasDelegate.listarTodosEstadosComCidades();
			ui.setEstados(estados);	
			ui.inicializarComboEstados();
		}catch (BusinessException e) {
			// TODO: handle exception
			e.printStackTrace();
		}
	}
	
	@Override
	public void carregarDados() {
		// TODO Auto-generated method stub
		carregarEstadosComCidades();
		List<PessoaFisica> clientes = null;
		try{
			clientes = consultasDelegate.listarTodosClientes();
			ui.setClientes(clientes);
		}catch (BusinessException e) {
			// TODO: handle exception
			e.printStackTrace();
			JOptionPane.showMessageDialog(ui,e.getMessage(), "..:: Erro ::..!", JOptionPane.ERROR_MESSAGE);
		}
		
	}

	public void gravarCliente(){
		try{
			if (ui.isEditing()){
				PessoaFisica clienteEmEdicao = ui.getClienteEmEdicao();
				int indiceClienteEmEdicao = ui.getIndiceClienteSelecionado();
				if (clienteEmEdicao != null){
					clienteEmEdicao.setNome(ui.getNomeCliente());
					clienteEmEdicao.setDataNascimento(ui.getDataNascimento());
					clienteEmEdicao.setEmail(ui.getEmail());
					List<Contato> contatos = clienteEmEdicao.getContatos();
					List<Documento> documentos = clienteEmEdicao.getDocumentos();
					//contatos
					//Telefone
					Contato telefone = clienteEmEdicao.getTelefone();
					if (telefone == null){
						telefone = new Contato(); //Se estava null o fone instancio e adiciono na lista de contatos
						telefone.setTipoContato(TipoContato.TELEFONE);
						contatos.add(telefone);
					}					
					telefone.setNrContato(ui.getTelefone());
					telefone.setPessoa(clienteEmEdicao);
					
					//Celular
					Contato celular = clienteEmEdicao.getCelular();
					if (celular == null){
						celular = new Contato();
						celular.setTipoContato(TipoContato.CELULAR);
						contatos.add(celular);
					}
					celular.setNrContato(ui.getCelular());
					celular.setPessoa(clienteEmEdicao);
					
					//Documentos
					//CPF					
					Documento cpf = clienteEmEdicao.getCPF();
					if (cpf == null){
						cpf = new Documento();
						cpf.setTipoDocumento(TipoDocumento.CPF);
						documentos.add(cpf);
					}
					cpf.setNumero(ui.getCPF());
					cpf.setPessoa(clienteEmEdicao);
					
					//RG
					Documento rg = clienteEmEdicao.getRG();
					if(rg == null){
						rg = new Documento();
						rg.setTipoDocumento(TipoDocumento.RG);
						documentos.add(rg);
					}
					rg.setNumero(ui.getRG());
					rg.setPessoa(clienteEmEdicao);
					Endereco enderecoEmEdicao = clienteEmEdicao.getEndereco();
					enderecoEmEdicao.setNmLogradouro(ui.getLogradouro());
					enderecoEmEdicao.setNumero(ui.getNumero());
					enderecoEmEdicao.setComplemento(ui.getComplemento());
					enderecoEmEdicao.setBairro(ui.getBairro());
					enderecoEmEdicao.setCidade(ui.getCidadeSelecionada());
					enderecoEmEdicao.setCep(ui.getCEP());
				
					cadastrosDelegate.atualizarCliente(clienteEmEdicao);
					
					ui.atualizarCliente(clienteEmEdicao,indiceClienteEmEdicao);
					ui.setIsEditing(false);
					ui.limparFormulario();
					ui.editarCampos(false);
					ui.limparCorCamposObrigatorios();
				}else{
					JOptionPane.showMessageDialog(ui, "Por favor selecione em registro para editar!", "Seleção do cliente requerida!", JOptionPane.WARNING_MESSAGE);
				}
			}else{
				PessoaFisica novoCliente = new PessoaFisica();
				
				novoCliente.setNome(ui.getNomeCliente());
				novoCliente.setEmail(ui.getEmail());
				novoCliente.setDataNascimento(ui.getDataNascimento());
				
				List<Contato> contatosCliente = new ArrayList<Contato>();
			    List<Documento> documentosCliente = new ArrayList<Documento>();
				
				Contato telefone = new Contato();
			    telefone.setTipoContato(TipoContato.TELEFONE);
			    telefone.setNrContato(ui.getTelefone());
			    telefone.setPessoa(novoCliente);
			    contatosCliente.add(telefone);
			    
			    Contato celular = new Contato();
			    celular.setTipoContato(TipoContato.CELULAR);
			    celular.setNrContato(ui.getCelular());
			    celular.setPessoa(novoCliente);
			    contatosCliente.add(celular);
			    
			    Documento cpf = new Documento();
			    cpf.setTipoDocumento(TipoDocumento.CPF);
			    cpf.setNumero(ui.getCPF());
			    cpf.setPessoa(novoCliente);
			    documentosCliente.add(cpf);

			    Documento rg = new Documento();
			    rg.setTipoDocumento(TipoDocumento.RG);
			    rg.setNumero(ui.getRG());
			    rg.setPessoa(novoCliente);
			    documentosCliente.add(rg);			    
			    
				Endereco enderecoCliente = new Endereco();
				enderecoCliente.setNmLogradouro(ui.getLogradouro());
				enderecoCliente.setNumero(ui.getNumero());
				enderecoCliente.setComplemento(ui.getComplemento());
				enderecoCliente.setBairro(ui.getBairro());
				enderecoCliente.setCidade(ui.getCidadeSelecionada());
				enderecoCliente.setCep(ui.getCEP());
				
				novoCliente.setEndereco(enderecoCliente);
				novoCliente.setContatos(contatosCliente);
				novoCliente.setDocumentos(documentosCliente);
				
				novoCliente = cadastrosDelegate.cadastrarCliente(novoCliente);
				ui.inserirCliente(novoCliente);
				ui.limparFormulario();
				ui.limparCorCamposObrigatorios();
				ui.editarCampos(false);
			}
		}catch (PessoaFisicaSemNomeException e) {
			ui.mudarCorCampoObrigatorioNome();
			ui.requestFocusCampoNomeCliente();
			JOptionPane.showMessageDialog(ui, e.getMessage(), "..:: Aten��o ::..", JOptionPane.WARNING_MESSAGE);
		}catch (PessoaFisicaJaExistenteException e) {
			ui.mudarCorCampoObrigatorioNome();
			ui.requestFocusCampoNomeCliente();
			JOptionPane.showMessageDialog(ui, e.getMessage(), "..:: Aten��o ::..", JOptionPane.WARNING_MESSAGE);
		}catch (LogradouroInvalidoException e) {
			ui.mudarCorCampoObrigatorioLogradouro();
			ui.requestFocusCampoLogradouro();
			JOptionPane.showMessageDialog(ui, e.getMessage(), "..:: Aten��o ::..", JOptionPane.WARNING_MESSAGE);
		}catch (NumeroLogradouroInvalidoException e) {
			ui.mudarCorCampoObrigatorioNumero();
			ui.requestFocusCampoNumero();
			JOptionPane.showMessageDialog(ui, e.getMessage(), "..:: Aten��o ::..", JOptionPane.WARNING_MESSAGE);
		}catch (CEPInvalidoException e) {
			ui.mudarCorCampoObrigatorioCep();
			ui.requestFocusCampoCep();
			JOptionPane.showMessageDialog(ui, e.getMessage(), "..:: Aten��o ::..", JOptionPane.WARNING_MESSAGE);
		}catch (BairroInvalidoException e) {
			ui.mudarCorCampoObrigatorioBairro();
			ui.requestFocusCampoBairro();
			JOptionPane.showMessageDialog(ui, e.getMessage(), "..:: Aten��o ::..", JOptionPane.WARNING_MESSAGE);
		}catch (CidadeRequeridaException e) {
			ui.mudarCorCampoObrigatorioCidade();
			ui.requestFocusCampoCidade();
			JOptionPane.showMessageDialog(ui, e.getMessage(), "..:: Aten��o ::..", JOptionPane.WARNING_MESSAGE);
		}catch (BusinessException e) {
			e.printStackTrace();
			JOptionPane.showMessageDialog(ui, e.getMessage(), "..:: Erro ::..", JOptionPane.ERROR_MESSAGE);
			
		}catch (DAOException e) {
			e.printStackTrace();
			JOptionPane.showMessageDialog(ui, e.getMessage(), "..:: Erro ::..", JOptionPane.ERROR_MESSAGE);
		}
		
	}	

	public PessoaFisica copiarCliente(PessoaFisica pessoaFisica){
		PessoaFisica result = null;
		if(pessoaFisica!= null){
			result = new PessoaFisica();
			result.setId(pessoaFisica.getId());
			result.setNome(pessoaFisica.getNome());
			result.setAtivo(pessoaFisica.isAtivo());
			result.setContatos(pessoaFisica.getContatos());
			result.setDataNascimento(pessoaFisica.getDataNascimento());
			result.setDocumentos(pessoaFisica.getDocumentos());
			result.setEmail(pessoaFisica.getEmail());
			result.setSexo(pessoaFisica.getSexo());
			result.setUsuario(pessoaFisica.getUsuario());
			result.setEndereco(pessoaFisica.getEndereco());
		}
		return result;
	}
	

	
}

